/*axios中文说明文档*/
//https://www.kancloud.cn/yunye/axios/234845


import axios from 'axios'


/*请求超时时间*/
axios.defaults.timeout = 60000;

/* `url` 是用于请求的服务器 URL*/
// axios.defaults.url = '/api'

/*
* // 用于请求之前对请求数据进行操作
  // 只用当请求方法为‘PUT’，‘POST’和‘PATCH’时可用
  // 最后一个函数需return出相应数据
  // 可以修改headers
  */
// axios.defaults.transformRequest = function(data,headers){
//     console.log("请求的参数")
//     console.log(JSON.stringify(data));
//     console.log(qs.stringify(data));
//     console.log(typeof data)
//     console.log(typeof JSON.stringify(data))
//     return qs.stringify(data);
// }

function isJSON(str) {
    if (typeof str == 'string') {
        try {
            var obj = JSON.parse(str);
            return !!(typeof obj == 'object' && obj);
        } catch (e) {
            return false;
        }
    }
}

//`transformResponse` 在传递给 then/catch 前，允许修改响应数据
axios.defaults.transformResponse = function (data) {
    if (isJSON(data)) {
        return JSON.parse(data);
    }
    return data;
}

// `withCredentials` 表示跨域请求时是否需要使用凭证 默认false
axios.defaults.withCredentials = false;


/*定义允许的响应内容的最大尺寸*/
axios.defaults.maxContentLength = 2000000;


/*request拦截器*/
axios.interceptors.request.use(function (res) {
    return res;
}, function (error) {
    return Promise.reject(error)
})

let isRefreshing = false;
let waitRequestList = [];
let userId = undefined;
let ticket = undefined;
let accessToken = undefined;

import {refreshToken} from '../lib/api'

/*response拦截器*/
axios.interceptors.response.use(function (resp) {
    //判断登录接口缓存ticket和token
    if (resp.config.url.indexOf('ivcs/api/v1/auth/logon') != -1) {
        let login = resp;
        accessToken = (login.data && login.data.data && login.data.data.accessToken) ? login.data.data.accessToken : '';
        let tokenData = (login.data && login.data.data && login.data.data.tokenData) ? login.data.data.tokenData : null;
        userId = tokenData ? tokenData.data.id : undefined;
        ticket = (login.data && login.data.data && login.data.data.ticket) ? login.data.data.ticket : '';
    }
    return resp;
}, function (error) {
    if (error.response && error.response.status === 401 &&
        error.response.data && error.response.data.code === '1101') {
        let body = {
            userId: userId,
            ticket: ticket
        }
        const {
            config
        } = error.response;
        if (!isRefreshing) {
            isRefreshing = true
            //TODO bugfix get request url
            return refreshToken(body).then((resp) => {
                console.log('refresh token success', resp);
                accessToken = resp.data.accessToken;
                error.response.config.headers['x-access-token'] = accessToken;
                waitRequestList.forEach((cb) => cb(accessToken))
                waitRequestList = []
                return axios.request(error.response.config);
            }).catch((e) => {
                console.log('refersh ticket error', e, e.response);
                return Promise.reject(e);
            }).finally(() => {
                isRefreshing = false;
            });
        } else {
            return new Promise(resolve => {
                waitRequestList.push(token => {
                    config.headers['x-access-token'] = token;
                    resolve(axios.request(config))
                })
            })
        }
    } else {
        return Promise.reject(error);
    }
})